package com.huaxin.device.dto.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;
import com.huaxin.hxenum.base.Describable;

/**
 * 防护等级（IPXX）枚举
 * 常见于开关柜、配电箱等电气设备外壳
 * IP = Ingress Protection，第一位数字表示防固体异物，第二位表示防水
 */
public enum ProtectionLevel implements BaseCodeEnum<String>, Describable {

    IP20("IP20", "防止大于12mm的固体物体侵入，防止垂直滴水", "手指或直径大于12mm的固体不能接触内部带电部分；无防水保护"),
    IP30("IP30", "防止大于2.5mm的固体物体侵入，防止垂直滴水", "工具、金属线等直径大于2.5mm的物体不能进入；无防水保护"),
    IP40("IP40", "防止大于1mm的固体物体侵入，防止垂直滴水", "大多数导线、细金属丝不能进入；无防水保护"),
    IP42("IP42", "防止大于1mm的固体物体侵入，防止倾斜15°滴水", "同上；可防止与垂直方向成15°以内的倾斜滴水"),
    IP54("IP54", "防尘（有限进入，不影响设备运行），防止溅水", "允许有限灰尘进入但不危害设备；可防止从任何方向溅水"),
    IP55("IP55", "防尘（有限进入，不影响设备运行），防止喷水", "同上；可防止从任何方向低压喷水"),
    IP65("IP65", "完全防尘，防止喷水", "完全阻止灰尘进入；可防止从任何方向低压喷水"),
    IP67("IP67", "完全防尘，防止短时浸水（1米深，30分钟）", "完全阻止灰尘进入；可短时间浸入水中（1米深，30分钟）");

    @EnumValue
    private final String code;
    private final String displayName;
    private final String description;

    ProtectionLevel(String code, String displayName, String description) {
        this.code = code;
        this.displayName = displayName;
        this.description = description;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 获取描述信息（用于前端展示）
     */
    @Override
    public String getDescription() {
        return description;
    }

    /**
     * 根据 code 获取枚举实例
     */
    public static ProtectionLevel of(String code) {
        if (code == null || code.trim().isEmpty()) return null;
        for (ProtectionLevel level : values()) {
            if (level.getCode().equalsIgnoreCase(code.trim())) {
                return level;
            }
        }
        return null;
    }

    /**
     * 判断是否为有效值
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }
}